AWS AppSync
https://gyazo.com/d7ed08df341eebb280654d09d1e4ce41
TL;DR
よいところ
Elasticsearch Service, Lambda, DynamoDB 等をデータソースとして容易に利用できる
特に、DynamoDB の場合はテーブル定義から GraphQL スキーマを自動生成できるので簡単に利用開始できる
Lambda を介せば大抵の API の手前に持ってくることができる
アクセス制御はかなり柔軟にできる
柔軟にできすぎる面もあるが...
例えば、あるユーザに対し、そのユーザ自身が post したデータに対してのみ mutation を許可する、みたいなこともできてしまう
AWS Console 上で手軽に GraphQL クエリの実行を試すことができる
現状少し buggy ではあるが...
ウリであるオフレインデータ同期やリアルタイムデータアクセス
試していないのでわからないがウリになっている
注意点 (2018/11 時点)
制限が割と厳しめ
クエリの最大実行時間が 10 秒 など
カスタムな scalar タイプをサポートしていない
Lambda の Batch Invoke が 5 つしかまとめてくれないので N+1 問題を解決できない
Resolver のデプロイ方法が現状 CloudFormation くらいしかなさそう
Apache Velocity で記述した Resolver 定義はコード管理したい気持ちになるが、現状だと CloudFormation テンプレートに埋め込んでデプロイするぐらいしかなさそう
AWS AppSync とは?
AWS AppSync とは、リアルタイムなデータ同期に特化したフルマネージドの GraphQL サービス。東京リージョンにもきている。
AWS AppSync is an enterprise-level, fully managed GraphQL service with real-time data synchronization and offline programming features.
特徴
フルマネージド GraphQL サービス
管理やスケーリングを気にする必要がない
リアルタイムのデータアクセス/更新
GraphQL サブスクリプションというものを利用するようだ
クライアント側でどのデータをリアルタイムで更新するか指定できる、とのこと
オフラインデータ同期
オフラインプログラミングモデルがサポートされている
クライアントはアプリケーションデータをオフラインでも利用でき、データの追加や更新も行える
複数のデータソースへのアクセス
アクセス制御
IAM, Cognito, API Key, ...
機能
DynamoDB から GraphQL スキーマを自動生成
リゾルバーマッピングテンプレート
下記の変換方法の定義 (VTL)
GraphQL リクエスト -> データソースへのリクエスト
データソースからのレスポンス -> GraphQL レスポンス
やること
デフォルト値の設定
バリデーション、フォーマット
ユーザIDに基づいたレスポンスのフィルタリング/変更
複雑な権限チェック
自動生成
スキーマから自動生成
DynamoDB から自動生成
ファイングレイン・アクセスコントロール
特定のユーザだけにデータアクセスさせる
使い方
AWS AppSync には以下の機能がある。
Queries
Schema
Data Sources
Queries
https://gyazo.com/1b323639b57b78364c9d256dad72efcd
Schema
Schema Designer と呼ばれている。GraphQL SDL でスキーマ定義が行える。左ペインに定義を記述し、右ペインでリゾルバをアタッチする。
https://gyazo.com/ba09b2b74a5131ac7faf98862bae0d21
リゾルバは、以下の3つから構成される。
データソース
リクエストマッピングテンプレート
GraphQL を解釈し、データソースにあった形式に変換する
ページングのための処理や、その他特別なロジックを差し込みたい場合は、ここに差し込む
レスポンスマッピングテンプレート
リゾルバの結果を GraphQL に返す
マッピングテンプレートの記述には、Apache Velocity templating language (VTL) を利用する。
Data Sources
AppSync が参照する、データを永続化する AWS リソースを追加できる。リゾルバを作成する場合も、このデータソースとして追加されていない対象からはデータをフェッチできない。
現在対応しているデータソースは以下。
DynamoDB
AWS Lambda
Amazon Elasticsearch
Local
GraphQL
HTTP
料金
クエリおよびデータ変更操作 100 万回につき 4 USD*
リアルタイム更新 100 万回につき 2 USD**
AWS AppSync サービスへの接続 100 万分につき 0.08 USD
その他
クライアントの SDK には Apollo が利用されている。
デプロイは CloudFormation を使うくらいしか方法がなさそうだ。
よさそう!